package pers.ree.demo.basic;

public class FinalDemo {

    // 静态final
    public final static String STATIC_FINAL_STRING = "STATIC_FINAL_STRING";
    // 成员final
    public final String FINAL_STRING = "FINAL_STRING";


    public final void print1() {
       System.out.println("This is final print1 method");
    }

    public void print2() {
        System.out.println("This is print2 method");
    }

    public void print3(final int val1, int val2) {
        // 不能修改final参数的值
//        val1 = 5;
        val2 = 5;
        System.out.println("val1="+val1 + ", val2="+val2);
    }
}

class SubFinalDemo extends FinalDemo {

    /** final方法不能被覆盖，但是可以重载 begin */
//    @Override
//    public void print1() {
//
//    }


//    @Override
//    public final void print1() {
//
//    }

    public void print1(int val) {
        System.out.println("val="+val);
    }
    /** final方法不能被覆盖，但是可以重载 end */

    public void invokePrint() {
        // 子类可以调用父类的final方法
        super.print1();
    }

    /**
     * 子类覆盖父类方法时，可以加final
     */
    @Override
    public final void print2() {
        super.print2();
        System.out.println("This is override final print2 method");
    }

    @Override
    public void print3(int val1, final int val2) {
        // 带final参数的方法可以被覆盖，且覆盖后的参数的final可以删除或增加
        val1 = 10;
//        val2 = 20;
        super.print3(val1, val2);
    }

    /** 子类的static或成员常量可以与父类同名 */
    // 静态final
//    public final static String STATIC_FINAL_STRING = "SUB_STATIC_FINAL_STRING";
//    // 成员final
//    public final String FINAL_STRING = "SUB_FINAL_STRING";

    public static void main(String[] args) {
        SubFinalDemo subFinalDemo = new SubFinalDemo();
        subFinalDemo.invokePrint();
        subFinalDemo.print1(1);
        subFinalDemo.print2();
        subFinalDemo.print3(2, 3);

        // 局部final
        final String LOCAL_FINAL_STRING = "LOCAL_FINAL_STRING";
        System.out.println(LOCAL_FINAL_STRING);
        System.out.println(STATIC_FINAL_STRING);
        System.out.println(subFinalDemo.FINAL_STRING);
    }
}
